0331. 验证二叉树的前序序列化【中等】
1. 📝 题目描述
序列化二叉树的一种方法是使用 前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。

例如,上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # 代表一个空节点。
给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。
保证 每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 '#'。
你可以认为输入格式总是有效的
- 例如它永远不会包含两个连续的逗号,比如
"1,,3"。
注意:不允许重建树。
示例 1:
txt
输入: preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#"
输出: true1
2
2
示例 2:
txt
输入: preorder = "1,#"
输出: false1
2
2
示例 3:
txt
输入: preorder = "9,#,#,1"
输出: false1
2
2
提示:
1 <= preorder.length <= 10^4preorder由以逗号“,”分隔的[0,100]范围内的整数和“#”组成
2. 🎯 s.1 - 槽位计数
c
bool isValidSerialization(char* preorder) {
int slots = 1;
char* token = strtok(preorder, ",");
while (token) {
slots--;
if (slots < 0) return false;
if (token[0] != '#') slots += 2;
token = strtok(NULL, ",");
}
return slots == 0;
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
js
/**
* @param {string} preorder
* @return {boolean}
*/
var isValidSerialization = function (preorder) {
let slots = 1
const nodes = preorder.split(',')
for (const node of nodes) {
slots--
if (slots < 0) return false
if (node !== '#') slots += 2
}
return slots === 0
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
py
class Solution:
def isValidSerialization(self, preorder: str) -> bool:
slots = 1
for node in preorder.split(','):
slots -= 1
if slots < 0:
return False
if node != '#':
slots += 2
return slots == 01
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- 时间复杂度:
,其中 是节点数 - 空间复杂度:
算法思路:
- 初始化槽位为 1,每个节点消耗 1 个槽位
- 非空节点产生 2 个新槽位,过程中槽位不能为负,最终槽位必须为 0